package com.molichuxing.services.infrastructure.service;

import com.molichuxing.framework.result.ResponseResult;
import com.molichuxing.framework.service.RootService;
import com.molichuxing.services.business.dto.response.AlarmInfoDto;
import com.molichuxing.services.business.dto.response.CarWarnConfigDto;
import com.molichuxing.services.infrastructure.dto.response.IovCarOfflineAlarm;
import com.molichuxing.services.infrastructure.dto.response.IovMileageDto;
import com.molichuxing.services.infrastructure.dto.response.IovTrajectoryDto;

import java.util.List;
import java.util.Map;

/**
 * @author liuruifeng
 * 车联网车辆服务
 * 2019-10-17
 */
public interface IovCarService extends RootService {

    /**
     * 通过车架号获取对应的里程
     *
     * @param vinList
     * @return
     */
    ResponseResult<Map<String, IovMileageDto>> getMileageByVins(List<String> vinList) throws Exception;

    /**
     * 获取车辆当前行驶里程数-仪表盘里程
     *
     * @param vin 车架号
     * @return
     */
    Integer getCurrentMileage(String vin);

    /**
     * 获取车辆当前行驶里程数-仪表盘里程
     *
     * @param vins 车架号集合
     * @return
     */
    Map<String, Integer> getCurrentMileage(List<String> vins);

    /**
     * 获取车辆行驶里程数-实际里程
     *
     * @param vin 车架号
     * @return
     */
    Integer getOdoMileage(String vin);

    /**
     * 获取车辆当前行驶里程数-实际里程
     *
     * @param vins 车架号集合
     * @return
     */
    Map<String, Integer> getOdoMileage(List<String> vins);


    /**
     * 获取车辆查询电量
     *
     * @param vins 车架号集合
     * @return
     */
    Map<String, Byte> getSoc(List<String> vins);

    /**
     * 根据vin获取车辆轨迹的时间段
     *
     * @param vin
     * @return
     */
    ResponseResult<List<String>> getTrajectoryTime(String vin);


    /**
     * 根据vin获取车辆轨迹
     *
     * @param vin
     * @return
     */
    ResponseResult<List<IovTrajectoryDto>> getTrajectory(String vin, String startTime, String endTime);


    /**
     * 指定车辆是否在围栏
     *
     * @param vin     车架号
     * @param fenceId 围栏id
     * @return
     */
    ResponseResult<Boolean> carIsInside(String vin, Long fenceId) throws Exception;

    /**
     * 查询失联车辆报警
     *
     * @param vin       车架号
     * @param beginTime 最后通讯时间 开始时间
     * @param endTime   最后通讯时间 结束时间
     * @return
     */
    List<IovCarOfflineAlarm> listOfflineAlarmsByVin(String vin, String beginTime, String endTime, String license);

    /**
     * 获取所有车辆里程
     *
     * @return
     * @throws Exception
     */
    List<IovMileageDto> getMileage() throws Exception;

    /**
     * 获取车辆是否存在未处理里程异变
     *
     * @param vin 车架号
     * @return
     * @throws Exception
     */
    boolean getIsMileageExAlarms(String vin) throws Exception;

    /**
     * 获取里程异变接口
     *
     * @param vin       车牌号
     * @param beginTime 开始时间
     * @param endTime   结束时间
     * @param license   车牌号
     * @return
     * @throws Exception
     */
    List<AlarmInfoDto> getMileageExAlarmsList(String vin, String beginTime, String endTime, String license);

    /**
     * 获取围栏报警接口
     *
     * @param vin
     * @param beginTime
     * @param endTime
     * @param license
     * @return
     */
    List<AlarmInfoDto> getFenceAlarmList(String vin, String beginTime, String endTime, String license, List<Integer> fenceIds);

    /**
     * 解除车辆控制（车辆解锁）
     *
     * @param vin  车架号
     * @param memo 原因说明
     * @return true：成功，false：失败，null：无需操作
     * @throws Exception
     */
    Boolean modifyCarDecontrol(String vin, String memo);

    /**
     * 查询车辆动力状态
     *
     * @param vin 车架号
     * @@return true：开锁，false：锁定，null：查询失败
     */
    Boolean getCarControlStatus(String vin);


    /**
     * 车辆控制命令
     *
     * @param vin         车架号
     * @param operateType 操作类型  4设为租赁、5设为非租赁、8开启动、9关闭动力
     * @param accountId   账户id
     * @param account     账户Name
     * @return
     */
    Boolean vehicleControlCommand(String vin, Integer operateType, Integer accountId, String account);

    /**
     * 批量查詢動力
     *
     * @@return true：开锁，false：锁定，null：查询失败
     */
    Map<String, Object> getCarControlStatus();

    /**
     * 车辆解除授权
     *
     * @param vin       车架号
     * @param accountId 账户id
     * @param account   账户Name
     * @return
     */
    Boolean vehicleIsAuth(String vin, Integer accountId, String account);

    /**
     * 查询失联配置
     *
     * @return
     */
    CarWarnConfigDto getCarOfflineConfig();

    /**
     * 修改失联配置
     *
     * @param id
     * @param paramValue
     * @return
     */
    Boolean modifyCarOfflineConfig(Long id, Double paramValue);

}
